package mx.ipn.presentacion;

import javax.xml.namespace.QName;

import mx.ipn.Constantes;
import mx.ipn.to.UsuarioTO;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

import com.trolltech.qt.gui.QMessageBox;

public class ConexionConNegocios {
	static RPCServiceClient clienteServicios;

	public static void inicializar() {
		try {
			clienteServicios = new RPCServiceClient();
		} catch (AxisFault a) {
			QMessageBox.critical(null, "Error",
					"No se puede iniciar la conexión con el servidor.",
					QMessageBox.StandardButton.Ok,
					QMessageBox.StandardButton.Ok);
		}
		Options options = clienteServicios.getOptions();
		// EPR del servicio, se puede encontrar en
		// http://localhost:8080/axis2/services/listServices
		EndpointReference targetEPR = new EndpointReference(
				Constantes.URL_SERVICIOS_NEGOCIOS);
		options.setTo(targetEPR);
		options
				.setProperty(
						org.apache.axis2.addressing.AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES,
						Boolean.TRUE);
	}

	// Invocar servicio Robusto
	public static void invocaServicio(String servicio, Object argumentos) {
		QName operacion = new QName(Constantes.URI_SERVICIOS, servicio);

		Object[] opArgumentos = new Object[] { argumentos };

		try {
			clienteServicios.invokeRobust(operacion, opArgumentos);
		} catch (AxisFault a) {
			QMessageBox.critical(null, "Error",
					"No hay conexión con el servidor.",
					QMessageBox.StandardButton.Ok,
					QMessageBox.StandardButton.Ok);
		}

	}

	// Invocar servicio Bloqueando
	public static Object invocaServicio(String servicio, Object argumentos,
			Class tipoRespuesta) {
		QName operacion = new QName(Constantes.URI_SERVICIOS, servicio);

		Object[] opArgumentos = new Object[] { argumentos };
		Class[] opTipoRespuesta = new Class[] { tipoRespuesta };

		Object[] respuesta = null;

		try{
		respuesta = clienteServicios.invokeBlocking(operacion, opArgumentos,
				opTipoRespuesta);
		} catch (AxisFault a) {
			QMessageBox.critical(null, "Error",
					"No hay conexión con el servidor.",
					QMessageBox.StandardButton.Ok,
					QMessageBox.StandardButton.Ok);
			
			return null;
		}
		
		return respuesta[0];
	}

	// Invocar servicio Bloqueando sin argumentos
	public static Object invocaServicio(String servicio, Class tipoRespuesta) {
		QName operacion = new QName(Constantes.URI_SERVICIOS, servicio);

		Object[] opArgumentos = new Object[] {};
		Class[] opTipoRespuesta = new Class[] { tipoRespuesta };

		Object[] respuesta = null;

		try {
		respuesta = clienteServicios.invokeBlocking(operacion, opArgumentos,
				opTipoRespuesta);
		} catch (AxisFault a) {
			QMessageBox.critical(null, "Error",
					"No hay conexión con el servidor.",
					QMessageBox.StandardButton.Ok,
					QMessageBox.StandardButton.Ok);
			
			return null;
		}
		
		return respuesta[0];
	}
}
